package me.pascoej.ajario.util;
import me.pascoej.ajario.packet.PacketType;
import me.pascoej.ajario.packet.serverbound.SetNickname;
import me.pascoej.ajario.protocol.WebSocketHandler;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
* Created by john on 6/15/15.
*/
public class LagScore {
public static double lagScore(URI uri) {
double lagScore = 0;
final long[] updatePackets = {0};
final long[] firstUpdatePacket = {-1};
final long sample = 10000;
WebSocketHandler webSocketHandler = new WebSocketHandler(uri,null);
CompletableFuture<Double> updateSecondFuture = new CompletableFuture<>();
webSocketHandler.registerPacketListener(agarPacket -> {
long currentTime = System.currentTimeMillis();
if (agarPacket.getType() == PacketType.ClientBound.UPDATE_NODES) {
updatePackets[0] += 1;
if (firstUpdatePacket[0] == -1) {
firstUpdatePacket[0] = currentTime;
} else {
long elapsed = currentTime - firstUpdatePacket[0];
if (elapsed > sample) {
double updatesSecond = (double)updatePackets[0] / (elapsed / 1000.0);
updateSecondFuture.complete(updatesSecond);
webSocketHandler.close();
}
}
}
});
webSocketHandler.sendPacket(new SetNickname("facebook"));
double updateSecond = 10;
try {
updateSecond = updateSecondFuture.get(20000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
//e.printStackTrace();
} catch (ExecutionException e) {
//e.printStackTrace();
} catch (TimeoutException e) {
//e.printStackTrace();
}
double avgPing = 0;
try {
int times = 15;
double total = 0;
for (int i = 0; i < times; i++) {
long before = System.currentTimeMillis();
InetAddress.getByName(uri.getHost()).isReachable(300);
total += System.currentTimeMillis() - before;
}
avgPing = total/times;
} catch (IOException e) {
e.printStackTrace();
}
if (avgPing <= 90) {
lagScore += avgPing;
}else {
lagScore += Math.pow(avgPing,1.2);
}
lagScore -= Math.pow(updateSecond,1.6);
return lagScore;
}
}